package CodeProcess;

/**
 * 试用范围处理器
 *
 * @author zzy
 * @version V1.0
 * @since 2022/8/2
 */
public abstract class ProjectCodeProcess {

    public abstract String process(String[] args);

    /**
     * 获取D直径的位置，找到焊接位置参数下标
     * 注：排除列中具有PD的可能性错误分割
     *
     * @param args
     * @return
     */
    public static int getPositionIndex(String[] args) {
        int index = 0;
        for (int i = 0; i < args.length; i++) {
            if (args[i].contains("D") && !args[i].equals("PD")) {
                index = i + 1;
                break;
            }
        }
        return index;
    }

    /**
     * 判断是否有小数点之后为零的去掉
     */
    public static String replace(String num) {
        if (num.indexOf(".") > 0) {
            num = num.replaceAll("0+?$", "");//去掉多余的0
            num = num.replaceAll("[.]$", "");//如最后一位是.则去掉
        }
        return num;
    }

    /**
     * 数据处理器 T-T
     *
     * @param line  args[index] -> t5D60/60(90°)
     * @return      result 下标： 0 管壁厚度t  1 主管外径D1  2 支管外径D2  3 主管与支管角度
     */
    public static Float[] pipeLineT_THandler(String line) {
        Integer[] symbol = new Integer[6];

        // 0 管壁厚度t  1 主管外径D1  2 支管外径D2  3 主管与支管角度
        Float[] result = new Float[4];

        if (!line.startsWith("t")) {
            throw new IllegalArgumentException("管壁厚度数据错误!");
        }

        // 分解标识符
        for (int i = 0; i < line.length(); i++) {
            if ("t".equals(Character.toString(line.charAt(i)))) {
                symbol[0] = i;
            }
            if ("D".equals(Character.toString(line.charAt(i)))) {
                symbol[1] = i;
            }
            if ("/".equals(Character.toString(line.charAt(i)))) {
                symbol[2] = i;
            }
            if ("（".equals(Character.toString(line.charAt(i))) || "(".equals(Character.toString(line.charAt(i)))) {
                symbol[3] = i;
            }
            if ("°".equals(Character.toString(line.charAt(i)))) {
                symbol[4] = i;
            }
            if ("）".equals(Character.toString(line.charAt(i))) || ")".equals(Character.toString(line.charAt(i)))) {
                symbol[5] = i;
            }
        }
        // 分解数据
        result[0] = Float.valueOf(line.substring(symbol[0] + 1, symbol[1]));
        result[1] = Float.valueOf(line.substring(symbol[1] + 1, symbol[2]));

        // 分解符中无度数参数
        if (symbol[3] == null) {
            result[2] = Float.valueOf(line.substring(symbol[2] + 1, line.length()));
        }

        // 分解符中有度数
        else {
            result[2] = Float.valueOf(line.substring(symbol[2] + 1, symbol[3]));
            result[3] = Float.valueOf(line.substring(symbol[3] + 1, symbol[4]));

            if (!line.endsWith(")") && !line.endsWith("）")) {
                throw new IllegalArgumentException("管直径数据格式错误!");
            }
        }

        return result;
    }

    /**
     * 数据处理器 P-T
     *
     * @param line args[index] -> t5D60
     * @return
     */
    public static Float[] pipeLineP_THandler(String line) {
        Integer[] symbol = new Integer[2];

        // 0 管壁厚度t  1 管外径D
        Float[] result = new Float[2];

        if (!line.startsWith("t")) {
            throw new IllegalArgumentException("管壁厚度数据错误!");
        }

        // 分解标识符
        for (int i = 0; i < line.length(); i++) {
            if ("t".equals(Character.toString(line.charAt(i)))) {
                symbol[0] = i;
            }
            if ("D".equals(Character.toString(line.charAt(i)))) {
                symbol[1] = i;
            }
        }

        // 分解数据
        result[0] = Float.valueOf(line.substring(symbol[0] + 1, symbol[1]));
        result[1] = Float.valueOf(line.substring(symbol[1] + 1, line.length()));
        return result;
    }

    /**
     * 数据处理器 P-T & FW
     *
     * @param line args[index] -> T5D60
     * @return
     */
    public static Float[] pipeLineP_T_FWHandler(String line) {
        Integer[] symbol = new Integer[2];

        // 0 管壁厚度T  1 管外径D
        Float[] result = new Float[2];

        if (!line.startsWith("T")) {
            throw new IllegalArgumentException("管壁厚度数据错误!");
        }

        // 分解标识符
        for (int i = 0; i < line.length(); i++) {
            if ("T".equals(Character.toString(line.charAt(i)))) {
                symbol[0] = i;
            }
            if ("D".equals(Character.toString(line.charAt(i)))) {
                symbol[1] = i;
            }
        }

        // 分解数据
        result[0] = Float.valueOf(line.substring(symbol[0] + 1, symbol[1]));
        result[1] = Float.valueOf(line.substring(symbol[1] + 1, line.length()));
        return result;
    }

    /**
     * 数据处理器 套管
     *
     * @param line args[index] -> T3D30T5
     * @return
     */
    public static Float[] pipeLineT_D_THandler(String line) {

        // 0 内管壁厚T  1 内管外径D   2 外管壁厚T
        Float[] result = new Float[3];

        int p1 = 0; int p2 = 0; int p3 = 0;
        int count = 0;

        if (line.startsWith("T")) {
            for (int i = 0; i < line.length(); i++) {
                if ("T".equals(Character.toString(line.charAt(i)))) {
                    count++;

                    if (count > 1) {
                        p3 = i;
                    }
                }

                if ("D".equals(Character.toString(line.charAt(i)))) {
                    p2 = i;
                }
            }
        }

        result[0] = Float.valueOf(line.substring(p1 + 1, p2));
        result[1] = Float.valueOf(line.substring(p2 + 1, p3));
        result[2] = Float.valueOf(line.substring(p3 + 1, line.length()));

        return result;
    }

    /**
     * 判断是否为套管
     *
     * @return
     */
    public static boolean isDrivepipe(String line) {
        int p1 = 0; int p2 = 0; int p3 = 0;
        int count = 0;

        if (line.startsWith("T")) {
            for (int i = 0; i < line.length(); i++) {
                if ("T".equals(Character.toString(line.charAt(i)))) {
                    count++;

                    if (count > 1) {
                        p3 = i;
                    }
                }

                if ("D".equals(Character.toString(line.charAt(i)))) {
                    p2 = i;
                }
            }
        }

        return p1 < p2 && p2 < p3;
    }

    /**
     * 判断是否是特殊金属焊缝
     *
     * @param args
     * @return
     */
    public static String getSpecialElement(String[] args) {

        String str = args[args.length - 1];
        if ("Z1".equals(str) || "Z2".equals(str) || "Z3".equals(str) || "Z4".equals(str)) {
            return str;
        }
        else {
            return null;
        }
    }

}
